<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>图解HTTP 笔记 | 我的世界</title>
    <meta name="generator" content="VuePress 1.8.2">
    <link rel="icon" href="/notes/favicon.ico">
    <link rel="manifest" href="/notes/manifest.json">
    <meta name="description" content="学习，生活，还有美食~">
    
    <link rel="preload" href="/notes/assets/css/0.styles.8453c794.css" as="style"><link rel="preload" href="/notes/assets/js/app.f19b5e39.js" as="script"><link rel="preload" href="/notes/assets/js/2.69392339.js" as="script"><link rel="preload" href="/notes/assets/js/48.953bb15e.js" as="script"><link rel="preload" href="/notes/assets/js/14.e376f3f7.js" as="script"><link rel="prefetch" href="/notes/assets/js/10.4748ef2e.js"><link rel="prefetch" href="/notes/assets/js/11.4ec67c3b.js"><link rel="prefetch" href="/notes/assets/js/12.db234a0a.js"><link rel="prefetch" href="/notes/assets/js/13.0bdeeeea.js"><link rel="prefetch" href="/notes/assets/js/15.873f63d0.js"><link rel="prefetch" href="/notes/assets/js/16.6d650151.js"><link rel="prefetch" href="/notes/assets/js/17.f0bcb5c9.js"><link rel="prefetch" href="/notes/assets/js/18.7dffee3a.js"><link rel="prefetch" href="/notes/assets/js/19.5f0252c4.js"><link rel="prefetch" href="/notes/assets/js/20.abea2681.js"><link rel="prefetch" href="/notes/assets/js/21.252713aa.js"><link rel="prefetch" href="/notes/assets/js/22.c99488d0.js"><link rel="prefetch" href="/notes/assets/js/23.3839292f.js"><link rel="prefetch" href="/notes/assets/js/24.9cc2f325.js"><link rel="prefetch" href="/notes/assets/js/25.e9dcd2f1.js"><link rel="prefetch" href="/notes/assets/js/26.31898ae6.js"><link rel="prefetch" href="/notes/assets/js/27.88db2371.js"><link rel="prefetch" href="/notes/assets/js/28.2d29c56c.js"><link rel="prefetch" href="/notes/assets/js/29.a0b42251.js"><link rel="prefetch" href="/notes/assets/js/3.48b2b659.js"><link rel="prefetch" href="/notes/assets/js/30.9b38a2bb.js"><link rel="prefetch" href="/notes/assets/js/31.d374da8e.js"><link rel="prefetch" href="/notes/assets/js/32.7868c3f3.js"><link rel="prefetch" href="/notes/assets/js/33.87730e15.js"><link rel="prefetch" href="/notes/assets/js/34.5a5b6c6e.js"><link rel="prefetch" href="/notes/assets/js/35.1deedbd4.js"><link rel="prefetch" href="/notes/assets/js/36.d39f2b24.js"><link rel="prefetch" href="/notes/assets/js/37.d87637b4.js"><link rel="prefetch" href="/notes/assets/js/38.d118907c.js"><link rel="prefetch" href="/notes/assets/js/39.9f2c8514.js"><link rel="prefetch" href="/notes/assets/js/4.161aee82.js"><link rel="prefetch" href="/notes/assets/js/40.917feb30.js"><link rel="prefetch" href="/notes/assets/js/41.78e1b969.js"><link rel="prefetch" href="/notes/assets/js/42.cd6ac9d4.js"><link rel="prefetch" href="/notes/assets/js/43.961a438d.js"><link rel="prefetch" href="/notes/assets/js/44.ef1661d7.js"><link rel="prefetch" href="/notes/assets/js/45.b89cd059.js"><link rel="prefetch" href="/notes/assets/js/46.8ca9e560.js"><link rel="prefetch" href="/notes/assets/js/47.a35bec74.js"><link rel="prefetch" href="/notes/assets/js/49.ae614c87.js"><link rel="prefetch" href="/notes/assets/js/5.ef4783db.js"><link rel="prefetch" href="/notes/assets/js/50.a9fbc190.js"><link rel="prefetch" href="/notes/assets/js/51.12ae367b.js"><link rel="prefetch" href="/notes/assets/js/52.57a5efe4.js"><link rel="prefetch" href="/notes/assets/js/53.861eb65b.js"><link rel="prefetch" href="/notes/assets/js/54.3bc1c9a1.js"><link rel="prefetch" href="/notes/assets/js/55.f724b26c.js"><link rel="prefetch" href="/notes/assets/js/56.02e48e7a.js"><link rel="prefetch" href="/notes/assets/js/6.72ed1ea6.js"><link rel="prefetch" href="/notes/assets/js/7.f1e39dec.js"><link rel="prefetch" href="/notes/assets/js/8.84b75613.js"><link rel="prefetch" href="/notes/assets/js/9.e1cd5390.js">
    <link rel="stylesheet" href="/notes/assets/css/0.styles.8453c794.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/notes/" class="home-link router-link-active"><img src="/notes/images/fish.gif" alt="我的世界" class="logo"> <span class="site-name can-hide">我的世界</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/notes/notes/" class="nav-link router-link-active">🎓 学习</a></div><div class="nav-item"><a href="/notes/life/" class="nav-link">🏸 生活</a></div> <a href="https://gitee.com/zgj6" target="_blank" rel="noopener noreferrer" class="repo-link">
    git
    <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/notes/notes/" class="nav-link router-link-active">🎓 学习</a></div><div class="nav-item"><a href="/notes/life/" class="nav-link">🏸 生活</a></div> <a href="https://gitee.com/zgj6" target="_blank" rel="noopener noreferrer" class="repo-link">
    git
    <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav>  <ul class="sidebar-links"><li><section class="sidebar-group collapsable depth-0"><p title="学习笔记" class="sidebar-heading"><span>学习笔记</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p title="JavaScript 高程笔记" class="sidebar-heading"><span>JavaScript 高程笔记</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p title="HTTP" class="sidebar-heading open"><span>HTTP</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/notes/notes/tujie-http/" aria-current="page" title="图解HTTP 笔记" class="active sidebar-link">图解HTTP 笔记</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#第一章-了解web及网络基础" title="第一章 了解Web及网络基础" class="sidebar-link">第一章 了解Web及网络基础</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#ip-协议" title="IP 协议" class="sidebar-link">IP 协议</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#确保可靠性的tcp协议" title="确保可靠性的TCP协议" class="sidebar-link">确保可靠性的TCP协议</a></li></ul></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#第二章-简单的http协议" title="第二章 简单的HTTP协议" class="sidebar-link">第二章 简单的HTTP协议</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#第三章-http报文中的http信息" title="第三章 HTTP报文中的HTTP信息" class="sidebar-link">第三章 HTTP报文中的HTTP信息</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#第四章-返回结果的http状态码" title="第四章 返回结果的HTTP状态码" class="sidebar-link">第四章 返回结果的HTTP状态码</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#第五章-与http协作的web服务器" title="第五章 与HTTP协作的Web服务器" class="sidebar-link">第五章 与HTTP协作的Web服务器</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#通信数据转发程序-代理、网关、隧道" title="通信数据转发程序：代理、网关、隧道" class="sidebar-link">通信数据转发程序：代理、网关、隧道</a></li></ul></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#第六章-http首部" title="第六章 HTTP首部" class="sidebar-link">第六章 HTTP首部</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#_4种首部字段类型" title="4种首部字段类型" class="sidebar-link">4种首部字段类型</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#cookie" title="Cookie" class="sidebar-link">Cookie</a></li></ul></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#第七章-确保web安全的https" title="第七章 确保Web安全的HTTPS" class="sidebar-link">第七章 确保Web安全的HTTPS</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#http-加密-认证-证书-完整性保护-https" title="HTTP+加密+认证（证书）+完整性保护 = HTTPS" class="sidebar-link">HTTP+加密+认证（证书）+完整性保护 = HTTPS</a></li></ul></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#第八章-确认访问用户身份的认证" title="第八章 确认访问用户身份的认证" class="sidebar-link">第八章 确认访问用户身份的认证</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#ssl客户端认证" title="SSL客户端认证" class="sidebar-link">SSL客户端认证</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#基于表单认证" title="基于表单认证" class="sidebar-link">基于表单认证</a></li></ul></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#第九章-基于http的功能追加协议" title="第九章 基于HTTP的功能追加协议" class="sidebar-link">第九章 基于HTTP的功能追加协议</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#ajax解决方法" title="AJAX解决方法" class="sidebar-link">AJAX解决方法</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#comet解决方法" title="Comet解决方法" class="sidebar-link">Comet解决方法</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#spdy" title="SPDY" class="sidebar-link">SPDY</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#使用浏览器进行全双工通信的-websocket" title="使用浏览器进行全双工通信的 WebSocket" class="sidebar-link">使用浏览器进行全双工通信的 WebSocket</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#http-2" title="HTTP/2" class="sidebar-link">HTTP/2</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#webdav" title="WebDAV" class="sidebar-link">WebDAV</a></li></ul></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#第十章-构建web内容的技术" title="第十章 构建Web内容的技术" class="sidebar-link">第十章 构建Web内容的技术</a></li><li class="sidebar-sub-header"><a href="/notes/notes/tujie-http/#第十一章-web的攻击技术" title="第十一章 Web的攻击技术" class="sidebar-link">第十一章 Web的攻击技术</a></li></ul></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p title="微信小程序" class="sidebar-heading"><span>微信小程序</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p title="TS" class="sidebar-heading"><span>TS</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p title="Vite" class="sidebar-heading"><span>Vite</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p title="interviewquestion" class="sidebar-heading"><span>interviewquestion</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p title="AI" class="sidebar-heading"><span>AI</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p title="UE" class="sidebar-heading"><span>UE</span> <span class="arrow right"></span></p> <!----></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="图解http-笔记"><a href="#图解http-笔记" class="header-anchor">#</a> 图解HTTP 笔记</h1> <h2 id="第一章-了解web及网络基础"><a href="#第一章-了解web及网络基础" class="header-anchor">#</a> 第一章 了解Web及网络基础</h2> <p>不同硬件、操作系统之间的通信，所有这一切都需要一种规则，这种规则叫做协议</p> <p>HTTP 协议是 TCP/IP 协议族中的一个协议</p> <p>TCP/IP 分为四层：应用层、传输层、网络层和数据链路层</p> <p>分层的好处是：每个层内部可以自由改动，不会影响其它层；每一层的设计也相对简单，不用考虑其它层。</p> <p>【应用层】：应用层决定了向用户提供应用服务时通信的活动，有一些常见的应用层协议：HTTP、FTP、DNS</p> <p>【传输层】：传输层提供网络上两台计算机之间的数据传输。有两个性质不同的协议：TCP（传输控制协议）和 UDP（用户数据报协议）</p> <p>【网络层】：网络层（IP协议）用来处理网络上流动的数据包，数据包是网络传输的最小数据传输单位，该层规定了通过怎样的路径把数据包传送给对方</p> <p>【数据链路层】：链路层用来处理网络的硬件部分，包括控制操作系统、硬件设备的驱动、网卡、光纤等硬件</p> <h3 id="ip-协议"><a href="#ip-协议" class="header-anchor">#</a> IP 协议</h3> <p>IP协议（Internet Protocol）的作用就是把各种数据包传送给对方，而要保证实时传送到，需要两个重要条件：IP地址和MAC地址。IP间的通信依赖MAC地址，使用ARP协议才可以凭借MAC地址进行通信，使用ARP协议可以根据通信方的IP地址查出对应的MAC地址。</p> <h3 id="确保可靠性的tcp协议"><a href="#确保可靠性的tcp协议" class="header-anchor">#</a> 确保可靠性的TCP协议</h3> <p>TCP协议提供可靠的字节流服务，字节流服务是指将大块数据分割成以报文段为单位的数据包进行管理，TCP能确认数据是否传达到对方，使用三次握手策略准确无误地将数据送达目标处，三次握手的工作流程如下：</p> <div class="language- extra-class"><pre class="language-text"><code>             --SYN--&gt;   
客户端    &lt;--SYN/ACK--   服务器
             --ACK--&gt;   
</code></pre></div><p>在握手过程中如果有某个阶段莫名中断，TCP协议会再次以相同的顺序重发相同的数据包</p> <p>DNS服务是应用层的服务，它提供域名到IP地址之间的解析服务</p> <p>URL是URI的子集</p> <h2 id="第二章-简单的http协议"><a href="#第二章-简单的http协议" class="header-anchor">#</a> 第二章 简单的HTTP协议</h2> <p>使用HTTP协议时，必定一端是客户端，另一端是服务器端</p> <p>请求必定由客户端发出，服务器端回复相应</p> <p>HTTP是不保存状态的协议（无状态协议），这是为了可以更快地处理大量事务。使用Cookie技术再用HTTP通信就可以管理状态了。</p> <p>告知服务器意图的HTTP方法：</p> <ol><li>GET：获取资源</li> <li>POST：传输实体主题</li> <li>PUT：传输文件</li> <li>HEAD：获得报文首部</li> <li>DELETE：删除文件</li> <li>OPTIONS：询问支持的方法</li> <li>TRACE：追踪路径</li> <li>CONNECT：要求用隧道协议连接代理</li></ol> <p>除了支持RESTful的API可使用PUT和DELETE，一般使用GET和POST方法</p> <p>HTTP协议初始版本不支持持久连接，就是说每进行一次HTTP通信就要断开一次TCP连接（断开TCP连接需要四次挥手）</p> <div class="language- extra-class"><pre class="language-text"><code>                 ---SYN--&gt;
                 &lt;--SYN/ACK---
                 ---ACK--&gt;

【客户端】    --- HTTP Request --&gt;    【服务器】
            &lt;-- HTTP Response --

                  &lt;--FIN---
                  ---ACK--&gt;
                  ---FIN--&gt;
                  &lt;--ACK--
</code></pre></div><p>HTTP/1.1和一部分HTTP/1.0支持了持久连接，使用管线化可以并发请求</p> <p>由于HTTP是无状态协议，节约了服务器的消耗。Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态</p> <h2 id="第三章-http报文中的http信息"><a href="#第三章-http报文中的http信息" class="header-anchor">#</a> 第三章 HTTP报文中的HTTP信息</h2> <p>请求端（Client）的报文称为请求报文，响应端（Server）的报文称为响应报文，HTTP报文是由多行（使用CR+LF换行）字符串文本</p> <p>HTTP报文的结构：报文首部+空行（CR+LF）+报文主体</p> <p>可以使用Fiddler查看原始报文内容</p> <p><img src="https://ws3.sinaimg.cn/large/005BYqpgly1g1cooeomnvj31350rgqcb.jpg" alt="Fiddler"></p> <p>报文主体和实体主体的差异：</p> <ol><li>报文是HTTP通信的基本单位，通过HTTP通信传输</li> <li>实体作为请求或响应的有效载荷数据被传输，器内容由实体首部和实体主体组成</li></ol> <p>压缩传输的内容编码</p> <p>通过服务器压缩后发送，客户端接收并解码</p> <p><img src="https://ws3.sinaimg.cn/large/005BYqpggy1g1coprlhdmj31350rg489.jpg" alt="gizp"></p> <p>常用的内容编码方式：gzip（GNU）、compress（UNIX）、deflate（zlib）、identity（不进行编码）</p> <p>可以通过分割发送的分块传输编码，让浏览器逐步显示页面；而不是全部传输完成，解码之后再显示页面。</p> <p>通过MIME和Multipart方式，发送多种数据的多部分对象集合</p> <p>范围请求：Range，请求一部分的文件内容</p> <p>内容协商返回最适合的内容，通过请求报文某些首部字段，服务器自动返回最适合的内容（例如语言）</p> <h2 id="第四章-返回结果的http状态码"><a href="#第四章-返回结果的http状态码" class="header-anchor">#</a> 第四章 返回结果的HTTP状态码</h2> <p>状态码告知从服务器端返回的请求结果</p> <p>状态码由3位数字和原因短语组成，如：200 OK。第一位指定了响应类别，后两位无分类</p> <div class="language- extra-class"><pre class="language-text"><code>分类	分类描述
1**	信息，服务器收到请求，需要请求者继续执行操作
2**	成功，操作被成功接收并处理
3**	重定向，需要进一步的操作以完成请求
4**	客户端错误，请求包含语法错误或无法完成请求
5**	服务器错误，服务器在处理请求的过程中发生了错误
</code></pre></div><p><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status" target="_blank" rel="noopener noreferrer">HTTP状态码<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></p> <h2 id="第五章-与http协作的web服务器"><a href="#第五章-与http协作的web服务器" class="header-anchor">#</a> 第五章 与HTTP协作的Web服务器</h2> <p>使用单台虚拟主机（Virtual Host）实现多个域名，域名通过DNS服务映射到IP地址，由于虚拟主机可以寄存多个不同主机名和域名的网站，因此在发送HTTP请求时，必须在Host首部指定主机名或域名的URI</p> <h3 id="通信数据转发程序-代理、网关、隧道"><a href="#通信数据转发程序-代理、网关、隧道" class="header-anchor">#</a> 通信数据转发程序：代理、网关、隧道</h3> <p><img src="https://ws3.sinaimg.cn/large/005BYqpgly1g1cq0ksamlj30m209eac4.jpg" alt="代理"></p> <p>代理可以做到对指定URI的访问控制；<strong>缓存代理</strong>通过将资源缓存到代理服务器加快客户端访问速度；<strong>透明代理</strong>不会对报文进行任何加工处理</p> <p><img src="https://ws3.sinaimg.cn/large/005BYqpggy1g1cq56aav6j30ku06k3zf.jpg" alt="网关"></p> <p>网关的工作机制与代理十分相似，网关能使通信线路上的服务器提供非HTTP协议的服务，使用网关能提高通信的安全性</p> <p><img src="https://ws3.sinaimg.cn/large/005BYqpggy1g1cq5e5c8wj30md0703zn.jpg" alt="隧道"></p> <p>隧道可按要求建立起一条与其他服务器的通信线路，使用SSL等加密进行通信，保证客户端与服务端的安全通信</p> <h2 id="第六章-http首部"><a href="#第六章-http首部" class="header-anchor">#</a> 第六章 HTTP首部</h2> <p><img src="https://ws3.sinaimg.cn/large/005BYqpgly1g1cooeomnvj31350rgqcb.jpg" alt="请求报文和响应报文的首部"></p> <p>请求报文由方法、URI、HTTP版本、HTTP首部字段构成</p> <p>响应报文由HTTP版本、状态码（数字和原因短语）、HTTP首部字段构成</p> <p>HTTP首部字段传递许多重要信息，首部字段由字段名和字段值构成，中间用冒号分隔</p> <p><code>Content-Type: text/html</code></p> <p>首部字段可以有多个值：</p> <p><code>Keep-Alive: timeout=5, max=100</code></p> <h3 id="_4种首部字段类型"><a href="#_4种首部字段类型" class="header-anchor">#</a> 4种首部字段类型</h3> <p><img src="https://ws3.sinaimg.cn/large/005BYqpggy1g1crnhd4b1j30mi0gi75x.jpg" alt="响应报文和请求报文首部"></p> <p>通用首部字段：请求报文和响应报文都会使用的首部</p> <p>请求首部字段：客户端向服务端发送请求报文时使用的首部</p> <p>响应首部字段：从服务端向客户端返回响应报文时使用的首部</p> <p>实体首部字段：补充了资源内容更新时间等与实体有关的信息</p> <p>Cookie、Set-Cookie等首部字段属于非HTTP/1.1正式的首部字段，使用频率很高</p> <p>通过Cache-Control首部字段控制缓存</p> <p><img src="https://ws3.sinaimg.cn/large/005BYqpgly1g1cooeomnvj31350rgqcb.jpg" alt="权重值"></p> <p>上图中，Accept首部字段告知服务器客户端能处理的媒体类型，以及优先级，其中<code>q=</code>代表权重，权重的范围在0~1之间（可精确到小数点后3位），默认权重是1，用分号<code>;</code>隔开</p> <p>使用Host首部字段可以区分虚拟主机中指定的主机</p> <p>User-Agent首部字段用于传达浏览器的种类</p> <h3 id="cookie"><a href="#cookie" class="header-anchor">#</a> Cookie</h3> <p>目前使用的Cookie标准是网景公司制定的标准的扩展，是一种事实上的标准</p> <p>Set-Cookie：响应首部字段，开始状态管理所使用的Cookie信息
Cookie：请求首部字段，服务器接收到的Cookie信息</p> <p>通过在Set-Cookie中设置HttpOnly属性可以让JS不能访问cookie，从而阻止XSS（跨站脚本攻击）</p> <h2 id="第七章-确保web安全的https"><a href="#第七章-确保web安全的https" class="header-anchor">#</a> 第七章 确保Web安全的HTTPS</h2> <p>HTTP的缺点：</p> <ol><li>通信使用明文（不加密），内容可能会被窃听（TCP/IP是可能被窃听的网络）</li> <li>不验证对方身份，有可能遭遇伪装</li> <li>无法证明报文的完整性（指的是准确度），可能被篡改</li></ol> <p>通信的加密：使用SSL（安全套接层）或TLS（安全层传输协议）的组合使用，加密HTTP的通信内容</p> <p>用SSL简历安全通信之后，进行的HTTP通信，称为HTTPS（超文本安全传输协议HTTP Secure，或 HTTP over SSL）</p> <p>可以对报文主体进行加密，但客户端和服务端必需支持相同的加密解密机制</p> <p>SSL不仅提供加密处理，而且还使用了一种被称为<strong>证书</strong>的手段，可用于确定方</p> <p>证书由值得信任的第三方机构颁发，用以证明服务器和客户端是实际存在的，伪造证书是异常困难的事</p> <p>请求或响应在传输过程中，遭攻击者拦截并篡改内容的攻击称为中间人攻击</p> <h3 id="http-加密-认证-证书-完整性保护-https"><a href="#http-加密-认证-证书-完整性保护-https" class="header-anchor">#</a> HTTP+加密+认证（证书）+完整性保护 = HTTPS</h3> <p>HTTPS是身披SSL协议的HTTP，运行在应用层的SMTP和TELNET协议均可配合SSL使用，SSL是当今世界上应用最广的网络安全技术</p> <p>HTTPS采用对称秘钥（共享秘钥）加密和非对称秘钥（公开秘钥）加密混合的加密机制，在秘钥交换环节使用公开秘钥加密方式，之后建立的通信交换报文阶段使用共享秘钥加密方式</p> <p>使用数字证书认证机构（CA）证明公钥的正确性</p> <h2 id="第八章-确认访问用户身份的认证"><a href="#第八章-确认访问用户身份的认证" class="header-anchor">#</a> 第八章 确认访问用户身份的认证</h2> <p>确认登录者本人的方式：密码、动态令牌、数字证书、生物认证、IC卡</p> <p>HTTP使用的认证方式：BASIC认证（基本认证）、DIGEST认证（摘要认证）、SSL客户端认证、FormBase认证（基于表单认证）</p> <p>BASIC认证（HTTP/1.0起），是服务器与客户端之间的认证方式，BASIC认证在使用上不够便捷灵活（浏览器无法实现认证注销），达不到多数网站期望的安全等级（账号密码明文传输），因此并不常用</p> <p><img src="https://ws3.sinaimg.cn/large/005BYqpgly1g1dphg6b1aj30r90intbd.jpg" alt="BASIC认证"></p> <p>DIGEST认证（HTTP/1.1起），提供了高于BASIC认证的安全等级，提供密码防窃听，但不存在防止用户伪装的保护机制，使用范围也有限</p> <p><img src="https://ws3.sinaimg.cn/large/005BYqpgly1g1dq19o15lj30qr0mhado.jpg" alt="DIGEST认证"></p> <h3 id="ssl客户端认证"><a href="#ssl客户端认证" class="header-anchor">#</a> SSL客户端认证</h3> <p>使用ID和密码进行的认证，如果ID和密码被盗，就有可能被第三者冒充，利用SSL客户端认证可以避免该情况发生。</p> <p>为了达到SSL客户端认证的目的，需要事先将客户端证书分发给客户端，并且客户端必须安装此证书</p> <p>SSL客户端认证步骤：</p> <ol><li>服务端发送Certificate Request报文，要求客户端提供证书</li> <li>客户端把证书信息以Client Certificate报文方式发给服务器</li> <li>服务端验证客户端证书通过后，领取客户端证书中的公钥，然后开始HTTPS加密通信</li></ol> <p>通常SSL客户端认证不仅依靠证书，还会和基于表单认证组合形成一种双因素认证。使用证书确认客户端身份，用表单来确认是用户本人行为</p> <p>SSL客户端认证需要用到客户端证书，需要支付费用</p> <h3 id="基于表单认证"><a href="#基于表单认证" class="header-anchor">#</a> 基于表单认证</h3> <p>基于表单的认证并不是HTTP协议中定义的，客户端会向服务器上的Web应用程序发送登录信息（一般使用AJAX或者HTML Form），服务端Web应用基于认证结果来决定是否认证成功</p> <p>认证多半为基于表单的认证，如果全面考虑过安全性能而实现的表单认证，可以具备高度的安全等级</p> <p>基于表单认证，一般使用Cookie来管理Session会话，因为HTTP协议是无状态协议，不能通过协议层面保存会话状态。Set-Cookie（内容是Session ID）存在于服务端发出的响应报文中，Session ID被客户端接收，之后客户端发出的请求报文头部都会带上Cookie（Session ID），这样服务器就可以识别用户和其认证状态</p> <h2 id="第九章-基于http的功能追加协议"><a href="#第九章-基于http的功能追加协议" class="header-anchor">#</a> 第九章 基于HTTP的功能追加协议</h2> <p>使用HTTP协议探知服务器上是否有内容更新，就必须频繁地从客户端到服务端进行确认，如果服务器上没有内容更新，就会产生徒劳的通信</p> <p>为了解决频繁从服务器获取新信息的问题</p> <p>HTTP通信的问题（瓶颈）：</p> <ol><li>一条连接上只能发送一个请求</li> <li>请求只能从客户端开始，客户端不可以接收除响应以外的指令</li> <li>请求/响应首部未经压缩就发送，首部信息越多延迟越大</li> <li>发送冗长的首部。每次互相发送相同的首部造成的浪费较多</li> <li>可以任意选择数据压缩格式，费强制压缩发送</li></ol> <h3 id="ajax解决方法"><a href="#ajax解决方法" class="header-anchor">#</a> AJAX解决方法</h3> <p>AJAX（异步JavaScript和XML），是一种利用JavaScript和浏览器DOM的操作，局部更新页面数据的手段，不需要刷新整个页面就可以得到新的数据。利用AJAX有可能导致大量请求的产生，且并未解决HTTP协议本身存在的问题</p> <h3 id="comet解决方法"><a href="#comet解决方法" class="header-anchor">#</a> Comet解决方法</h3> <p>Comet是一种用于web的推送技术，能使服务器实时地将更新的信息传送到客户端，而无须客户端发出请求，当前有两种实现方式，长轮询和iframe流。——维基百科</p> <p>Comet为了维持连接会消耗更多的资源，仍未解决HTTP协议本身存在的问题</p> <h3 id="spdy"><a href="#spdy" class="header-anchor">#</a> SPDY</h3> <p>SPDY是HTTP/2的前身，SPDY以会话层的形式加入，控制对数据的流动，但还是采用HTTP简历通信连接。使用SPDY后，HTTP协议额外获得以下功能：</p> <ol><li>多路复用流：通过单一的TCP连接，可以无限制处理多个HTTP请求</li> <li>富裕请求优先级</li> <li>压缩HTTP首部</li> <li>推送功能：支持服务器主动向客户端推送数据</li> <li>服务器提示功能</li></ol> <h3 id="使用浏览器进行全双工通信的-websocket"><a href="#使用浏览器进行全双工通信的-websocket" class="header-anchor">#</a> 使用浏览器进行全双工通信的 WebSocket</h3> <p>WebSocket允许<strong>服务端主动向客户端推送数据</strong>。在WebSocket API中，浏览器和服务器只需要完成<strong>一次握手</strong>，两者之间就直接可以创建<strong>持久性的连接</strong>，并进行双向数据传输<strong>双向数据传输</strong>。</p> <p><img src="https://ws3.sinaimg.cn/large/005BYqpgly1g1dsuur47cj30pa0ka0vs.jpg" alt="WebSocket通信"></p> <h3 id="http-2"><a href="#http-2" class="header-anchor">#</a> HTTP/2</h3> <p>HTTP/2是HTTP协议自1999年HTTP 1.1发布后的首个更新，主要基于SPDY协议。——<a href="https://zh.wikipedia.org/wiki/HTTP/2" target="_blank" rel="noopener noreferrer">维基百科<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></p> <h3 id="webdav"><a href="#webdav" class="header-anchor">#</a> WebDAV</h3> <p>基于Web的分布式编写和版本控制（WebDAV）是超文本传输协议（HTTP）的扩展，有利于用户间协同编辑和管理存储在万维网服务器文档。——<a href="https://zh.wikipedia.org/wiki/%E5%9F%BA%E4%BA%8EWeb%E7%9A%84%E5%88%86%E5%B8%83%E5%BC%8F%E7%BC%96%E5%86%99%E5%92%8C%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6" target="_blank" rel="noopener noreferrer">维基百科<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></p> <h2 id="第十章-构建web内容的技术"><a href="#第十章-构建web内容的技术" class="header-anchor">#</a> 第十章 构建Web内容的技术</h2> <p>（略）</p> <h2 id="第十一章-web的攻击技术"><a href="#第十一章-web的攻击技术" class="header-anchor">#</a> 第十一章 Web的攻击技术</h2> <p><strong>跨站脚本攻击</strong>（XSS）是代码注入的一种，假设一个用户在网页评论输入框内输入含有恶意JavaScript的脚本，而Web应用没有过滤标签直接输出，这样就会影响其他用户浏览的页面，从而使恶意代码执行，用于盗取其他用户的信息</p> <p><strong>跨站请求伪造</strong>（CSRF）是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作（如发邮件，发消息，甚至财产操作如转账和购买商品）。由于浏览器曾经认证过，所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞：简单的身份验证只能保证请求发自某个用户的浏览器，却不能保证请求本身是用户自愿发出的。——<a href="https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0" target="_blank" rel="noopener noreferrer">维基百科<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></p> <p>SQL注入攻击</p> <p>OS命令注入攻击</p> <p>HTTP首部注入攻击，可造成以下影响：</p> <ol><li>设置任何Cookie信息</li> <li>重定向至任意URL</li> <li>显示任意的主体（HTTP响应截断攻击）</li></ol> <p>邮件首部注入攻击</p> <p>目录遍历攻击</p></div> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">上次更新:</span> <span class="time">2023-4-5 17:45:19</span></div></footer> <div class="page-nav"><p class="inner"><span class="prev">
      ←
      <a href="/notes/notes/pro-js-for-web-dev-note/chapter06.html" class="prev">面向对象的程序设计</a></span> <span class="next"><a href="/notes/notes/wx-use-note/">目录</a>
      →
    </span></p></div> </main></div><div class="global-ui"><!----><div id="live2d-widget" class="live2d-widget-container" style="position:fixed;right:65px;bottom:0px;width:135px;height:300px;z-index:99999;opacity:0.8;pointer-events:none;"><canvas id="live2d_canvas" width="135" height="300" class="live2d_canvas" style="position:absolute;left:0px;top:0px;width:135px;height:300px;"></canvas></div></div></div>
    <script src="/notes/assets/js/app.f19b5e39.js" defer></script><script src="/notes/assets/js/2.69392339.js" defer></script><script src="/notes/assets/js/48.953bb15e.js" defer></script><script src="/notes/assets/js/14.e376f3f7.js" defer></script>
  </body>
</html>
